package Mode;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池:
 * 如果频繁创建或销毁线程, 开销也很大,所以用线程池会减小开销
 * 线程池是"用户态"运行的代码
 * 而创建线程需要内核的支持, 是"内核态"的代码
 * "用户态"是基于应用程序上运行的, 速度要比在操作系统内核中的运行的"内核态"要快很多
 * 因为代码进入"内核态"就不可控了,内核啥时候给你干完活不知道
 *
 * 面试题:一个程序需要并发执行, 线程池需要设置为多少合适呢?
 * 不能回答具体数字, 要通过性能测试, 找到合适的值
 * 因为线程多了, 速度会变快, 但CPU占用率会变高
 * 线程少, 速度变慢, 但CPU占用率会变少
 * 所以要找到平衡点
 */

public class Test5 {
    public static void main(String[] args) {
        // 创建一个固定线程数目的线程池. 参数指定了线程个数
        ExecutorService pool = Executors.newFixedThreadPool(10);
        // 创建一个自动扩容的线程池. 会根据任务量来自动进行扩容
        Executors.newCachedThreadPool();
        // 创建一个只有一个线程的线程池.
        Executors.newSingleThreadExecutor();
        //创建一个带有定时器功能的线程池. 类似于 Timer
        Executors.newScheduledThreadPool(10);

        for (int i = 0; i < 100; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello threadpool");
                }
            });
        }
    }
}
